/*
 * Copyright (c) 2025 Huawei Device Co., Ltd.
 * Licensed under the Apache License, Version 2.0 (the "License"),
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

/**
 * @addtogroup TeeTrusted
 * @{
 *
 * @brief TEE（Trusted Excution Environment）可信执行环境API。
 *
 * 提供安全能力API，例如可信存储、加解密及可信时间等，用于可信应用程序开发。
 *
 * @since 20
 */

/**
 * @file tee_dynamic_srv.h
 *
 * @brief 提供与动态服务开发相关的API。
 *
 * @library NA
 * @kit TEEKit
 * @include <TEEKit/tee_dynamic_srv.h>
 * @syscap SystemCapability.Tee.TeeClient
 * @since 20
 */

#ifndef _TEE_DYNAMIC_SRV_H_
#define _TEE_DYNAMIC_SRV_H_

#include <pthread.h>
#include "tee_service_public.h"

#ifdef __cplusplus
extern "C" {
#endif

/**
 * @brief 定义动态服务的线程初始化信息。
 *
 * @since 20
 */
struct srv_thread_init_info {
    /** 指向线程启动函数的指针。 */
    void *(*func)(void *arg);
    /** 最大并发线程数。 */
    uint32_t max_thread;
    /** 线程的shadow属性。 */
    int32_t shadow;
    /** 线程的堆栈大小。 */
    uint32_t stack_size;
    /** 线程的超时时间（单位：秒）。 */
    uint32_t time_out_sec;
};

/**
 * @brief 定义用于服务分发函数的函数指针类型。
 *
 * @param msg 指向待处理IPC消息的指针。
 * @param sndr IPC消息的发送方。
 * @param rsp 指向IPC响应消息的指针。
 *
 * @since 20
 */
typedef void (*srv_dispatch_fn_t)(tee_service_ipc_msg *msg,
    uint32_t sndr, tee_service_ipc_msg_rsp *rsp);

/**
 * @brief 定义服务分发结构体。
 *
 * @since 20
 */
struct srv_dispatch_t {
    /** 命令标识符。 */
    uint32_t cmd;
    /** 线程分发函数的指针。 */
    srv_dispatch_fn_t fn;
};

/**
 * @brief 获取发送者的UUID。
 *
 * @param sender [IN]指示发送者的任务Id。
 * @param uuid [OUT]指示全局唯一标识符。
 *
 * @return TEE_SUCCESS：操作成功。\n
 *         TEE_ERROR_BAD_PARAMETERS：输入参数不正确，或文件名超过64字节。\n
 *         TEE_ERROR_ITEM_NOT_FOUND：表示未能根据发送者找到相应的UUID。\n
 *         TEE_ERROR_GENERIC：获取UUID失败。
 * @since 20
 */
TEE_Result tee_srv_get_uuid_by_sender(uint32_t sender, TEE_UUID *uuid);

/**
 * @brief 释放指定地址区域的对象映射。
 *
 * @param va_addr [IN]指示要释放的内存区域的地址。
 * @param size [IN]指示要释放的内存区域的大小。
 *
 * @since 20
 */
void tee_srv_unmap_from_task(uint32_t va_addr, uint32_t size);

/**
 * @brief 在调用进程的虚拟地址空间中创建新的映射。
 *
 * @param in_task_id [IN]指示任务ID。
 * @param va_addr [IN]指示要映射的内存区域的地址。
 * @param size [IN]指示要映射的内存区域的大小。
 * @param virt_addr [OUT]指示新映射的虚拟地址。
 *
 * @return 返回0表示操作成功。\n
 *         返回-1表示操作失败。
 * @since 20
 */
int tee_srv_map_from_task(uint32_t in_task_id, uint32_t va_addr, uint32_t size, uint32_t *virt_addr);

/**
 * @brief 根据任务名称分派任务。
 *
 * @param task_name [IN]指示任务名称。
 * @param dispatch [IN]指示分派信息。
 * @param n_dispatch [IN]指示分派数量。
 * @param cur_thread [IN]指示当前线程信息。
 *
 * @since 20
 */
void tee_srv_cs_server_loop(const char *task_name, const struct srv_dispatch_t *dispatch,
    uint32_t n_dispatch, struct srv_thread_init_info *cur_thread);

#ifdef __cplusplus
}
#endif

#endif
/** @} */